package br.com.naestrada.controller;

import br.com.naestrada.dao.DaoGenerico;
import br.com.naestrada.entities.Usuario;
import br.com.naestrada.util.FacesUtils;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import javax.servlet.http.HttpSession;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
 
@Controller("usuarioController")
@Scope("session")
public class UsuarioController {

	@Resource
	private DaoGenerico<Usuario, Integer> usuarioDao;

	private Usuario usuario;
        private String usuarioLogado;

	public UsuarioController() {
		this.usuario = new Usuario();
	}

	// captura a sessão do contexto criado
	// pelo JavaServer Faces
	FacesContext fc = FacesContext.getCurrentInstance();
	
	HttpSession session = (HttpSession) fc.getExternalContext().getSession(false);

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public DaoGenerico<Usuario, Integer> getUsuarioDao() {
		return usuarioDao;
	}

	public void setUsuarioDao(DaoGenerico<Usuario, Integer> usuarioDao) {
		this.usuarioDao = usuarioDao;
	}


	// verifica a existência do usuário e o retorna
	private Usuario verificaU(String email) {
		String query = "SELECT u FROM Usuario u WHERE u.email=:email";
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("email", email);
		return usuarioDao.pesqParam(query, params);

	}
	  
	//valida a entrada de e-mails no cadastro e área de login
	public void validaEmail(FacesContext context, UIComponent componente,
			Object objeto) throws ValidatorException {	
		String digitado = (String) objeto;
		Pattern p = Pattern.compile(".+@.+\\.[a-z]+");
		Matcher m = p.matcher(digitado);
		boolean matchFound = m.matches();

		if (!matchFound) {
			((UIInput) componente).setValid(false);
			FacesMessage message = new FacesMessage("Formato inv�lido.");
			context.addMessage(componente.getClientId(context), message);
		}
	}

	// executa o login no sistema
	// direcionando o usuário ao local indicado
	public String login() {

		Usuario u = verificaU(usuario.getEmail());
		// verifica se a senha resultante é
		// igual a senha encontrada no banco de dados
		if (u != null && u.getSenha().equals(usuario.getSenha())) {

			// cria uma sessão contendo o e-mail do usuario
			session.setAttribute("user", usuario.getEmail());
                        usuarioLogado = usuario.getEmail();

			// deixa o objeto usuario agora com os valores encontrados no banco
			usuario = u;

			// caso a sessão msg esteja com valor, a remove
			if (session.getAttribute("msg") != null) {
				session.removeAttribute("msg");
			}

			// redireciona para a área do usuário
			return "logado";

		} else {
			FacesUtils.mensErro("Usuário ou senha inválidos");
		}

		return null;

	}

	// vai para o cadastro de novo usu�rio
	public String novoUsuario() {
		this.usuario = new Usuario();
		return "novo_usuario";
	}
        
	public String enviarFoto() {		
		if (session.getAttribute("user") != null)
			return "enviar_foto";
		else
			return "logar"; // mostra o formulário de login		
	}        

	// caso o usuário seja salvo com sucesso
	public String salvar() {
		// se não há usuário logado
		if (usuario.getId() == null) {
			// verifica se o cadastro não possui
			// um usuário com o mesmo e-mail
			Usuario u = verificaU(usuario.getEmail());

			if (u != null && u.getEmail().equals(usuario.getEmail())) {
				// lança um erro global informando da existência do usu�rio
				FacesUtils.mensErro("Usuário existente");
				return null; // não redireciona a lugar algum

			} else { // caso o usuário não seja cadastrado

				// salva no banco de dados
				usuario = usuarioDao.salvar(usuario);
				// cria uma sessão contendo o e-mail do usuario
				session.setAttribute("user", usuario.getEmail());
                                usuarioLogado = usuario.getEmail();

			}

		} else { // caso esteja logado

			// pega os dados encontrados no formulário
			// e os salva
			usuarioDao.atualizar(usuario);

		}

		return "logado";
	}

	// vai para a área de usuário
	public String logar() {
		if (session.getAttribute("user") != null)
			return "logado"; // se estiver logado, vai direto a área
		else
			return "logar"; // mostra o formulário de login
	}

	// sai da área do usuário
	public String logout() {
		session.removeAttribute("user");
                usuarioLogado = null;
		return "logar";

	}

    public String getUsuarioLogado() {
        return usuarioLogado;
    }

    public void setUsuarioLogado(String usuarioLogado) {
        this.usuarioLogado = usuarioLogado;
    }
}
